package GestionPlannification;

import GestionBilleterie.Reservation;
import GestionBilleterie.Tarif;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 
 * @author Aude Legrand, Alexandre Becquet
 */
public class Representation {
    private Date date;
    private Piece piece;
    private int id;
    private List<Reservation> lesReservations;

    /**
     * Constructeur de la classe representation sans id
     * @param date la date de representation en chaine de caractère
     * @param piece la piece
     * @throws java.lang.Exception
     */
    public Representation(String date, Piece piece) throws Exception{
        this.date=outils.OutilsDate.stringToDate(date, "dd/MM/yyyy");
        this.piece=piece;
    }

    /**
     * Constructeur de la classe representation avec id
     * @param idRepresentation l'id de la la representation
     * @param date la date de representation
     * @param piece la piece
     * @throws java.lang.Exception
     */
    public Representation(int idRepresentation, Date date, Piece piece) throws Exception {
        this.id=idRepresentation;
        this.date=date;
        this.piece=piece;
    }

    /**
     * Constructeur de la classe representation sans id
     * @param date la date de la representation
     * @param piece la piece
     */
    public Representation(Date date, Piece piece) {
        this.date=date;
        this.piece=piece;
    }

    /**
     * Recherche une representation grâce à son id
     * @param idRepresentation l'id de la representation recherchée
     * @return
     */
    public static Representation findEntitie(int idRepresentation){
        Representation a = null;
        try {
            a=RepresentationBD.readRepresentation(idRepresentation);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return a;
    }

    /**
     * Retourne tous les representations
     * @return la liste des representations
     */
    public static List<Representation> findEntities(){
        List<Representation> lesRepresentations = null;
        try {
             lesRepresentations= RepresentationBD.readAllRepresentations();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return lesRepresentations;
    }

    /**
     * Recherche une representation suivant une piece
     * @param p la piece correspondante
     * @return la liste des representations correnspondantes à cette pièce
     */
    static List<Representation> searchRepresentation(Piece p) {
        List<Representation> lesRepresentations = null;
        try {
            lesRepresentations= RepresentationBD.readAllRepresentations(p);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return lesRepresentations;
    }

    /**
     * Retourne l'id de la representation
     * @return l'id de la representation
     */
    public int getId() {
        return id;
    }

    /**
     * Retournela piece de la representation
     * @return la piece de la representation
     */
    public Piece getPiece() {
        return piece;
    }

    /**
     * Retourne la dete de la representation
     * @return la date de la representation
     */
    public Date getDateRepresentation() {
        return date;
    }

    /**
     * Retourne les reservations de la representation
     * @return la liste des reservations
     */
    public List<Reservation> getReservations() {
        return lesReservations;
    }

    /**
     * Retourne le nombre de reservations de la representation pour un tarif
     * @param idTarif l'id du tarif correspondant
     * @return le nombre de reservations
     */
    public int nbReservervations(int idTarif){
        int nbRes = 0;
        try {
            nbRes= RepresentationBD.getNbReservation(idTarif, this.id);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return nbRes;
    }

    /**
     * Retourne le nombre de places disponibles de la representaton pour un tarif
     * @param idTarif l'id du tarif correspondant
     * @return le nombre de places disponibles
     */
    public int nbPlacesDisponibles(int idTarif){
        int nbPlac = 0;
        try {
            nbPlac= RepresentationBD.getNbPlacesDisponibles(idTarif, this.id);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return nbPlac;
    }

    /**
     * Test si la representation est pleine
     * @return vrai si la representation est pleine, faux sinon
     */
    public boolean isPlein() {
        List<Tarif> lesTarifs=Tarif.findEntities();
        for(int i=0;i<lesTarifs.size();i++){
            if(nbPlacesDisponibles(lesTarifs.get(i).getId())>0) return false;
        }
        return true;
    }

    /**
     * Retourne la chaîne de caractère représentant la representation
     * @return la chaîne de caractère représentant la representation
     */
    public String toString(){
        String dateFormate;
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        dateFormate=sdf.format(date);
        sdf = new SimpleDateFormat("dd/MM/yyyy");
        dateFormate=dateFormate+" "+sdf.format(date);
        return dateFormate;
    }

    /**
     * Ajouter des reservations à la representations
     * @param reservations la liste des reservations à ajouter
     */
    public void addRerservations(List<Reservation> reservations) {
        this.lesReservations=reservations;
    }
        

}
